(* 文件 MicroC/Absyn.fs
   微型C语言的抽象语法，一种命令式语言。
   sestoft@itu.dk 2009-09-25

   必须在 Solution Explorer 中的 Interp.fs、Comp.fs 和 Contcomp.fs 之前
表达式（expr）、访问（access）、语句（stmt）、语句或声明（stmtordec）、顶级声明（topdec）和程序（program）等几种基本结构。
表达式包括了常量（CstF）、变量（Var）、赋值（Assign）、序列或（Andalso）、顺序或（Orelse）、函数调用（Call）、三元运算符（Prim3）等操作，用来表示程序中的各种表达式计算。
访问用来表示左值，即存储位置，包括了变量访问（AccVar）、指针解引用（AccDeref）、数组下标访问（AccIndex）等操作。
语句包括了条件语句（If）、循环语句（While、For、DoWhile）、表达式语句（Expr）、返回语句（Return）、代码块（Block）、Switch语句等，用来表示程序中的各种控制流和操作。
语句或声明用来表示在代码块内部的变量声明和语句列表。
顶级声明包括了函数声明（Fundec）和变量声明（Vardec），用来表示程序的顶层结构。
程序是顶级声明的列表，表示一个完整的程序。
*)

module Absyn

// 基本类型
// 注意，数组、指针是递归类型
// 这里没有函数类型，注意与上次课的 MicroML 对比
type typ =
  | TypF
  | TypI                             (* Type int                    *)
  | TypC                             (* Type char                   *)
  | TypA of typ * int option         (* Array type                  *)
  | TypP of typ                      (* Pointer type                *)
                                                                   
and expr =                           // 表达式，右值                                                
  | Access of access                 (* x    or  *p    or  a[e]     *) // 访问左值（右值）
  | Assign of access * expr          (* x=e  or  *p=e  or  a[e]=e   *) // =
  | Addr of access                   (* &x   or  &*p   or  &a[e]    *)
  | CstI of int                      (* Constant                    *)
  | Prim1 of string * expr           (* Unary primitive operator    *)
  | Prim2 of string * expr * expr    (* Binary primitive operator   *)  // + - * / % == != > < >=
  | Andalso of expr * expr           (* Sequential and              *)
  | Orelse of expr * expr            (* Sequential or               *)
  | Call of string * expr list       (* Function call f(...)        *)
  | Prim3 of expr * expr * expr    (* Binary primitive operator     *) // ?:
  | CstF of float32 
  //| Assign2 of access * expr       (* Binary primitive operator   *) // += -= *= /= %=
                                                                   
and access =                         //左值，存储的位置                                            
  | AccVar of string                 (* Variable access        x    *) 
  | AccDeref of expr                 (* Pointer dereferencing  *p   *)
  | AccIndex of access * expr        (* Array indexing         a[e] *)
                                                                   
and stmt =                                                         
  | If of expr * stmt * stmt         (* Conditional                 *)
  | While of expr * stmt             (* While loop                  *)
  | Expr of expr                     (* Expression statement   e;   *)
  | Return of expr option            (* Return from method          *)
  | Block of stmtordec list          (* Block: grouping and scope   *)
  | For of expr * expr * expr * stmt (* While loop                  *) // for
  | DoWhile of expr * stmt             (* doWhile loop                  *) //dowhile
  | Break                               (*break功能*)
  | Continue                            (*continue功能*)
  | Case of expr * stmt
  | Switch of expr * stmt list
  | Default of stmt 

  // 语句块内部，可以是变量声明 或语句的列表                                                              

and stmtordec =                                                    
  | Dec of typ * string              (* Local variable declaration  *)
  | Stmt of stmt                     (* A statement                 *)

// 顶级声明 可以是函数声明或变量声明
and topdec = 
  | Fundec of typ option * string * (typ * string) list * stmt
  | Vardec of typ * string

// 程序是顶级声明的列表
and program = 
  | Prog of topdec list
